package trabalho.das.fxml.views.controladores;

import builders.BuilderDeFamilia;
import comandos.ComandoCriarFamilia;
import entidades.Cor;
import entidades.Textura;
import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ColorPicker;
import javafx.scene.control.TextField;
import javafx.scene.paint.Color;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import sistema.ISistema;
import sistema.Sistema;
import trabalho.das.fxml.views.util.ConstantesGraficas;

/**
 * Trabalho DAS - 2014/2015
 * @author a21210380, a21190325, a21210392
 */
public class ControladorCriarFamilia implements Initializable {
    private final BuilderDeFamilia builder = new BuilderDeFamilia();
    
    @FXML
    private TextField nomeFamilia;
    
    @FXML
    private ColorPicker corLinhaPicker;

    @FXML
    private ColorPicker corTextoPicker;

    @FXML
    private TextField caminhoFicheiro;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        nomeFamilia.focusedProperty().addListener(
                (ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) -> {
                    String textNomeEstilo = nomeFamilia.getText();
                    if (textNomeEstilo == null || textNomeEstilo.isEmpty()) {
                        System.out.println("nomeEstilo == null || nomeEstilo == 0");
                        nomeFamilia.setStyle(ConstantesGraficas.INVALID_INPUT_STYLE);
                        return;
                    }
                    
                    if (builder.setNomeDaFamilia(textNomeEstilo)) {
                        nomeFamilia.setStyle(ConstantesGraficas.VALID_INPUT_STYLE);
                    } else {
                        nomeFamilia.setStyle(ConstantesGraficas.REPEATED_INPUT_STYLE);
                    }
                });
    }

    @FXML
    private void onCriarEstiloPressionado(ActionEvent event) {
        String textNomeEstilo = nomeFamilia.getText();
        String textCaminhoFicheiro = caminhoFicheiro.getText();
        if (textNomeEstilo == null || textNomeEstilo.isEmpty()) {
            System.out.println("nomeEstilo == null || nomeEstilo == 0");
            nomeFamilia.setStyle(ConstantesGraficas.INVALID_INPUT_STYLE);
            return;
        }
        if (textCaminhoFicheiro == null) {
            System.out.println("textCaminhoFicheiro == null");
            return;
        }

        if (!builder.setNomeDaFamilia(textNomeEstilo)) {
            System.out.println("!builder.setNomeDoEstilo(textNomeEstilo)");
            nomeFamilia.setStyle(ConstantesGraficas.INVALID_INPUT_STYLE);
            return;
        }

        ISistema sistema = Sistema.getInstance();

        if (textCaminhoFicheiro.isEmpty()) {
            textCaminhoFicheiro = Textura.NO_TEXTURE;
        }
        Textura textura = sistema.getTextura(0, textCaminhoFicheiro);

        builder.setFundo(textura);

        Color corLinhaTemp = corLinhaPicker.getValue();
        Cor corLinha = sistema.getCor(
                corLinhaTemp.getRed(),
                corLinhaTemp.getGreen(),
                corLinhaTemp.getBlue(),
                corLinhaTemp.getOpacity());
        builder.setCorDaLinha(corLinha);

        Color corTextoTemp = corTextoPicker.getValue();
        Cor corTexto = sistema.getCor(
                corTextoTemp.getRed(),
                corTextoTemp.getGreen(),
                corTextoTemp.getBlue(),
                corTextoTemp.getOpacity());
        builder.setCorDoTexto(corTexto);

        if (builder.estaPronto()) {
            ComandoCriarFamilia comando = new ComandoCriarFamilia(builder.construirFamilia());
            sistema.getGestorComandos().executeComando(comando);
            ((Stage) nomeFamilia.getScene().getWindow()).close();
        }
    }

    @FXML
    private void onCancelarPressionado(ActionEvent event) {
        ((Stage) nomeFamilia.getScene().getWindow()).close();
    }

    @FXML
    private void onProcurarFicheiroPressionado(ActionEvent event) {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Open Resource File");
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("All Images", "*.*"),
                new FileChooser.ExtensionFilter("jpg", "*.jpg"),
                new FileChooser.ExtensionFilter("png", "*.png")
        );
        File fileSelected = fileChooser.showOpenDialog(((Stage) nomeFamilia.getScene().getWindow()));
        if (fileSelected == null) {
            System.out.println("No File Selected!");
            return;
        }

        caminhoFicheiro.setText(fileSelected.getAbsolutePath());
    }

}
